package br.org.acessobrasil.processoacessibilidade.dao;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import br.org.acessobrasil.processoacessibilidade.vo.LinguagemProgramacaoPro;
import br.org.acessobrasil.processoacessibilidade.vo.PaginaPro;
import br.org.acessobrasil.processoacessibilidade.vo.SitioPro;

public class PaginaDao extends SuperDao<PaginaPro>{
	private static Logger logger = Logger.getLogger(PaginaDao.class);
	@Override
	public PaginaPro find(long id) {
		return getEntityManager().find(PaginaPro.class,id);
	}
	
	public synchronized PaginaPro create(PaginaPro pagina){
		PaginaPro paginaT = find(pagina.getUrl());
		if(paginaT!=null){
			return paginaT;
		}
		getEntityManager().persist(pagina);
		return pagina;
	}
	
	public PaginaPro find(String fullUrl) {
	
		if(fullUrl.contains("#")){
			fullUrl = fullUrl.substring(0,fullUrl.indexOf("#"));
		}
		EntityManager em = getEntityManager(); 
		synchronized (em) {
			try{
				//em.getTransaction().begin();				
				Query q = getEntityManager().createQuery("Select p From PaginaPro p where p.url = ?");
				q.setParameter(1, fullUrl);
				PaginaPro retorno = (PaginaPro)q.getSingleResult();
				//em.getTransaction().rollback();
				return retorno;
			}catch(NoResultException e){
				//em.getTransaction().rollback();
				return null;
			}catch(Exception e){
				logger.error("erro ao procurar " + fullUrl,e);
				//em.getTransaction().rollback();
				throw new RuntimeException();
			}
		}			
	}
	public PaginaPro loadFormularios(PaginaPro pagina){
		//Query q = getEntityManager().createNativeQuery("Select * From formulario f inner join pagina_formulario pf on pf.listaFormulario_idFormulario = f.idFormulario " +
		//		" where pf.pagina_idPagina = :idPagina");
		Query q = getEntityManager().createQuery("Select f From FormularioPro f where f.pagina.idPagina = :idPagina");
		q.setParameter("idPagina", pagina.getIdPagina());
		pagina.setListaFormulario(q.getResultList());
		return pagina;
	}

	public int count(LinguagemProgramacaoPro lingua,SitioPro sitio) {
		Query q = getEntityManager().createQuery("Select count(p) From PaginaPro p where p.idLinguagem = :idLinguagem and p.idSitio = :idSitio");
		q.setParameter("idSitio", sitio.getId());
		q.setParameter("idLinguagem", lingua.getIdLinguagem());
		return Integer.valueOf(q.getSingleResult().toString());
	}
}
